package com.witmore.skyline.web.service;

import com.witmore.skyline.db.entity.ProjectDO;
import com.witmore.skyline.web.controller.vo.param.ProjectAddParam;
import com.witmore.skyline.web.controller.vo.param.ProjectDeviceUsageRankParam;
import com.witmore.skyline.web.controller.vo.param.ProjectEditParam;
import com.witmore.skyline.web.controller.vo.param.ProjectParamVO;
import com.witmore.skyline.web.controller.vo.result.*;

import java.util.List;

public interface ProjectService {

    /**
     * 根据项目id查询当前项目及其所有子项目的id列表
     *
     * @param projectId 当前项目id
     * @return 包含当前项目id及其所有子项目id的列表
     */
    List<Integer> getProjectIdsWithChildren(Integer projectId);

    /**
     * 根据企业id查询当前项目列表 全部
     */
    ResponseResult<List<ProjectResultVO>> getProjectTree(Integer orgId);

    /**
     * 根据企业id查询当前项目列表 全部 带摄像头信息
     */
    ResponseResult<List<ProjectResultVO>> getProjectTree(Integer orgId,Boolean needCamera);

    /**
     * 根据企业id查询当前项目列表 全部 带摄像头信息和抓拍图数据
     */
    ResponseResult<List<ProjectResultVO>> getProjectTree(Integer orgId, Boolean needCamera, Boolean needCameraPic);


    /**
     * 根据项目部id 查询项目部名称路径
     * 如：产品部/产品1组/
     */
    String getProjectNamesPathByProjectId(Integer projectId);

    /**
     * 项目列表接口
     */
    ResponsePageResult<ProjectResultVO> projectListPage(ProjectParamVO projectParamVO);


    /**
     * 获取设备统计信息
     */
    ResponseResult<HomeStatisticsVO> getHomeStatistics(AccountSession accountSession);



    /**
     * 获取项目列表下的业务数据id列表
     */
    List<Integer> getBusinessIdList(Integer orgId, List<Integer> projectIdsWithChildren, Integer type);

    /**
     * 根据项目id 查询项目下 业务信息 包含 子项目下的数据
     */
    List<Integer> getBusinessIdListByProjectId(Integer orgId, Integer projectId, Integer type);

    /**
     * 根据业务id 获取项目名称 (只取当前业务关联的第一级项目名称)
     */
    String getProjectNameByBusinessId(Integer businessId,Integer type);

    /**
     * 根据业务id和业务类型获取项目部父类列表
     */
    List<ProjectDO> getProjectParentListByBusinessId(Integer businessId,Integer type);

    /**
     * 新增项目
     */
    ResponseResult<Void> add(ProjectAddParam param);

    /**
     * 编辑项目
     */
    ResponseResult<Void> edit(ProjectEditParam param);

    /**
     * 删除项目
     */
    ResponseResult<Void> delete(Integer id);

    /**
     * 项目设备使用率排名列表
     * @param accountSession 账户会话信息
     * @param param 查询参数
     * @return 项目设备使用率排名列表（时间段内汇总数据）
     */
    ResponseResult<List<ProjectDeviceUsageItemVO>> projectDeviceUsageRank(AccountSession accountSession, ProjectDeviceUsageRankParam param);

    /**
     * 项目部设备开工率排名列表
     * @param accountSession 账户会话信息
     * @param param 查询参数
     * @return 项目部设备开工率排名列表
     */
    ResponseResult<List<ProjectStartRateVO>> projectStartRateRank(AccountSession accountSession, ProjectDeviceUsageRankParam param);

    /**
     * 根据业务ID获取项目部ID
     * @param businessId 业务ID
     * @param type 业务类型 1设备 2摄像头 3管理员
     * @return 项目部ID
     */
    Integer getProjectIdByBusinessId(Integer businessId, Integer type);

}
